package com.cuc.platform.core.componet.security.service;

import java.util.List;
import java.util.Map;

import com.cuc.platform.core.componet.security.domain.SecurityUser;
import com.cuc.platform.core.service.ServiceException;

/**
 * @author peepul
 *	
 * 系统账号服务接口
 */
public interface SecurityUserService {
	public static final String HASH_ALGORITHM = "SHA-1";
	public static final int HASH_INTERATIONS = 1024;
	public static final int SALT_SIZE = 8;
	
	/**
	 * 设定安全的密码，生成随机的salt并经过1024次 sha-1 hash
	 */
	public SecurityUser editEntryptPassword(SecurityUser user);
	
	/**
	 * 根据标识获取SecurityUser对象
	 * 
	 * @param id
	 * @return SecurityUser
	 */
	public SecurityUser getSecurityUser(Long id);
	
	/**
	 * 获取所有账号对象
	 * 
	 * @return SecurityUser List
	 */
	public List<SecurityUser> getAllUsers();
	
	/**
	 * 根据账号名称获取SecurityUser及关联的角色集合，账号在系统中是唯一的。
	 * 
	 * @param userName
	 * @return
	 */
	public List<Map<String, Object>> getUserWithRoles(String userName);
	
	/**
	 * 新增用户对象
	 * 
	 * 新增用户的密码默认为空
	 * 
	 * @param user
	 */
	public void insertUser(SecurityUser user) throws ServiceException;
	
	/**
	 * 更新用户对象
	 * 
	 * @param user
	 * @throws ServiceException
	 */
	public void updateUser(SecurityUser user) throws ServiceException;
	
	/**
	 * 更改账号的状态标志
	 * 
	 * 用到的实际参数：1、id
	 * 				  2、status
	 * 					  	可用：1 
	 * 					  	不可用：0
	 * 
	 * @throws ServiceException
	 */
	public void updateUserStatus(Long userId, Integer status) throws ServiceException;
	
	/**
	 * 根据id删除user对象
	 * 
	 * 注：删除成功返回值为1，如没找到要删除的数据返回0，如果删除出错，则产生异常
	 * @param id
	 */
	public void delUserById(Long id) throws ServiceException;	
	
	/**
	 * 根据user id，查找所有的角色数据，其中角色已经和用户有关联的，用户对象id属性不为空，否则为空。
	 * 
	 * @param userId
	 * @return List<SecurityUser>
	 */
	public List<SecurityUser> findRoleswithUsers(Long userId);
	
	/**
	 * 保存用户与角色的关联关系。往ss_user_role中保存关联数据
	 * 
	 * @param map
	 */
	public void saveUserRoleUnions(String user_id, String[] role_ids) throws ServiceException;

	/**
	 * 根据登录账号查询账号对象，不带角色信息
	 * 
	 * @param username
	 * @return SecurityUser
	 */
	public SecurityUser getLoginUser(String username);		
}
